package com.mapaower.project.service;

import com.mapaower.project.entity.ProjectApplication;
import java.util.List;
import java.util.Optional;

/**
 * 项目报名服务接口
 * 定义项目报名相关的业务逻辑方法
 */
public interface ProjectApplicationService {

    /**
     * 创建项目报名
     * @param application 项目报名信息
     * @return 创建后的项目报名
     */
    ProjectApplication createApplication(ProjectApplication application);

    /**
     * 更新项目报名信息
     * @param application 项目报名信息
     * @return 更新后的项目报名
     */
    ProjectApplication updateApplication(ProjectApplication application);

    /**
     * 根据ID查找项目报名
     * @param id 项目报名ID
     * @return 项目报名信息
     */
    Optional<ProjectApplication> getApplicationById(Long id);

    /**
     * 根据项目ID查找报名记录
     * @param projectId 项目ID
     * @return 报名记录列表
     */
    List<ProjectApplication> getApplicationsByProjectId(Long projectId);

    /**
     * 根据开发人员ID查找报名记录
     * @param developerId 开发人员ID
     * @return 报名记录列表
     */
    List<ProjectApplication> getApplicationsByDeveloperId(Long developerId);

    /**
     * 检查开发人员是否已报名某个项目
     * @param projectId 项目ID
     * @param developerId 开发人员ID
     * @return 是否已报名
     */
    boolean hasApplied(Long projectId, Long developerId);

    /**
     * 更新项目报名状态
     * @param id 项目报名ID
     * @param status 新状态
     * @return 更新后的项目报名
     */
    ProjectApplication updateApplicationStatus(Long id, ProjectApplication.ApplicationStatus status);

    /**
     * 撤回项目报名
     * @param id 项目报名ID
     * @return 撤回后的项目报名
     */
    ProjectApplication withdrawApplication(Long id);

    /**
     * 删除项目报名
     * @param id 项目报名ID
     */
    void deleteApplication(Long id);
}